﻿package com.Galaxisfarm {
	// Bibliotecas da game engine Flixel
	import com.adamatomic.flixel.*;
	// Utilitários
	import flash.utils.*;
	// Bibliotecas para usar Lua	
	import luaAlchemy.LuaAlchemy;
    import luaAlchemy.lua_wrapper;
	import cmodule.lua_wrapper.CLibInit;
	
	public class PhaseOneState extends PhaseState {
		// Variável para armazenar se pode ou não cortar as árvores
		private var _cut_tree:Boolean;
		// Variável que armazena a quantidade total de árvores
		private var _total_trees:int;
		
		// Método construtor
		public function PhaseOneState():void {
			// Chama o construtor da classe herdada
			super();
			
			// Roda o script lua
			runScriptLua("phase_one.lua");
			
			// Inicialmente não pode cortar as árvores
			_cut_tree = false;
			
			// Quantidade total de árvores criadas
			_total_trees = Farm.getTrees().length;
			
			// Mensagem de parabéns
			dialogBox("Parabéns, você agora é o dono de uma\nfazenda! Sua fazenda, além de\neconomicamente viável, deve seguir a\numa série de requisitos ambientais!");
			_dialog_box.addComponent(new FlxButton(410, 365, new FlxSprite(null, 0, 0, false, false, 50, 20, 0xff25155E), onClickOKDialogBox1, new FlxSprite(null, 0, 0, false, false, 50, 20, 0xffE46713), new FlxText(0, 1, 50, 20, "OK", 0xffffff, null, 12, "center"), new FlxText(0, 1, 50, 20, "OK", 0xffffff, null, 12, "center")));
			
			// Verifica se a hud existe
			if (_hud) {
				// Inicializa a mensagem da porcentagem da reserva legal na hud
				_hud.setMessageLegalReserve();
			}
			
			addVersionBeta();
		}
		
		// Captura o click na dialog box 1
		private function onClickOKDialogBox1():void {
			_dialog_box.destroy();
			
			setTimeout(function():void {
				// Mensagem de instrução
				dialogBox("Fase 1\nSeu objetivo é limpar a área\npara construir a sua fazenda.");
				_dialog_box.addComponent(new FlxButton(410, 365, new FlxSprite(null, 0, 0, false, false, 50, 20, 0xff25155E), onClickOKDialogBox2, new FlxSprite(null, 0, 0, false, false, 50, 20, 0xffE46713), new FlxText(0, 1, 50, 20, "OK", 0xffffff, null, 12, "center"), new FlxText(0, 1, 50, 20, "OK", 0xffffff, null, 12, "center")));
			}, 100);			
		}
		
		// Captura o click na dialog box 2
		private function onClickOKDialogBox2():void {
			_dialog_box.destroy();
		}
		
		// Cria uma árvore que não pode ser cortada
		public function createNotCutTree(TreeName:String, X:uint, Y:uint, NearRiver:Boolean = false):void {
			var tree:* = createTree(TreeName, X, Y);
			if (tree != null) {
				tree.setIsCuttable(false);
				tree.setNearRiver(NearRiver);
				Farm.getTrees().add(tree);
				_lyr_sprites.add(tree);
			}			
		}
		
		// Cria uma árvore que pode ser cortada
		public function createCutTree(TreeName:String, X:uint, Y:uint):void {
			var tree:* = createTree(TreeName, X, Y);
			if (tree != null) {
				Farm.getTrees().add(tree);
				_lyr_sprites.add(tree);
			}
		}
		
		// Cria uma árvore
		protected function createTree(TreeName:String, X:uint, Y:uint):* {
			var tree:Object = null;
			switch(TreeName) {
				case "castanha_do_para":
					tree = new TreeCastanhaDoPara(X, Y);
					tree.play("normal");
					return tree as TreeCastanhaDoPara;
					break;
				case "angelim_pedra":
					tree = new TreeAngelimPedra(X, Y);
					tree.play("normal");
					return tree as TreeAngelimPedra;
					break;
				case "lobeira":
					tree = new TreeLobeira(X, Y);
					tree.play("normal");
					return tree as TreeLobeira;
					break;
				case "jatoba":
					tree = new TreeJatoba(X, Y);
					tree.play("normal");
					return tree as TreeJatoba;
					break;
				case "araucaria":
					tree = new TreeAraucaria(X, Y);
					tree.play("normal");
					return tree as TreeAraucaria;
					break;
				case "bracatinga":
					tree = new TreeBracatinga(X, Y);
					tree.play("normal");
					return tree as TreeBracatinga;
					break;
			}
			
			return null;
		}
		
		// Método que retorna se pode ou não cortar as árvores
		public function getCutTree():Boolean {
			return _cut_tree;
		}
		
		// Método que define se pode ou não cortar as árvores
		public function setCutTree(Value:Boolean):void {
			_cut_tree = Value;
		}
		
		// Método que cria o botão concluído
		public function createButtonCompleted(X:uint, Y:uint):void {
			var buttonCompleted:FlxButton = new FlxButton(
				X, 
				Y, 
				new FlxSprite(null, 0, 0, false, false, 65, 18, 0xff25155E), 
				onClickButtonCompleted, 
				new FlxSprite(null, 0, 0, false, false, 65, 18, 0xffE46713), 
				new FlxText(0, 1, 65, 18, "Concluído", 0xffffff, null, 10, "center"),
				new FlxText(0, 1, 65, 18, "Concluído", 0xffffff, null, 10, "center"));
			_lyr_sprites.add(buttonCompleted);
		}
		
		// Método chamado quando o botão de
		// concluído é clicado
		private function onClickButtonCompleted():void {
			if (!hasDialogBox()) {
				// Muda para a segunda fase
				FlxG.switchState(PhaseTwoState);
			}
		}
		
		// Método chamado constantemente
		override public function update():void {
			super.update();
			
			// Se não existir dialog box atualiza os demais componentes
			if (!hasDialogBox()) {
				// Verifica se o mouse está por cima de alguma árvore
				// somente quando o botão cortar árvore estiver ativo
				if (_cut_tree) {
					// Percorre todas as árvores
					var trees:FlxArray = Farm.getTrees();
					for (var i:int = (trees.length - 1); i >= 0; i--) {
						// Chama a função para alterar o comportamento do sprite
						var onMouseOver:Boolean = trees[i].checkOnMouseOver(FlxG.mouse);
					
						// Captura o click do mouse
						if (FlxG.justPressed(FlxG.MOUSE)) {
							// Se houver click e estiver em cima de uma árvore
							// efetua o corte
							if (onMouseOver) {
								// Verifica se pode cortar a árvore
								// de acordo com a quantidade da reserva legal
								var percentage:Number = Math.round(((100 * trees.length) / _total_trees));
								if (percentage >= _percentage_legal_reserve) {
									if (trees[i].isCuttable()) {
										// Só cortar árvore se possuir
										// dinheiro
										if (Farm.getMoney() > 100) {
											// Remove a árvore da tela
											trees[i].kill();
											// Remove a árvore do array
											trees.removeAt(i, true);
											// Diminui em 100 o dinheiro
											// para cada árvore cortada
											Farm.setMoney(Farm.getMoney() - 100);
											
											// Verifica se a hud existe
											if (_hud) {
												// Atualiza a mensagem da porcentagem
												// da reserva legal
												_hud.setLegalReserve(percentage);
											}
										} else {
											// Mensagem quando não possui
											// dinheiro para cortar árvore
											dialogBoxError("Você não tem dinheiro\nsuficiente para cortar\nmais árvores.");
										}
									} else {
										if (trees[i].getNearRiver()) {
											dialogBoxError("É proibido eliminar a matar ciliar.\nEla reduz impactos ambientas.");
										} else {
											if (trees[i].getName() == "Araucária") {
												dialogBoxError("Não é possível cortar a árvore Araucária\nno PR, RS e SC.");
											} else {
												dialogBoxError("Não é possível cortar\na árvore " + trees[i].getName() + ".");
											}
										}
									}
								} else {
									dialogBoxError("Você deve manter\npelo menos " + _percentage_legal_reserve + "%\nda reserva legal.");
								}
							}
						}
					}
				}
			}
		}
	}
}